#pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <unordered_set>
#include <bitset>
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N=160010,M=4e5+10;
int e[M],ne[M],h[N],w[M],idx;
int re[M];
int dfn[N],low[N],timestamp;
int stk[N],top;
bool in_stk[N];
int id[N],_size[N],scc_cnt;
int sum[N];
int dout[N];
int f[N];
void add(int a,int b,int c,double d)
{
    e[idx]=b;
    w[idx]=c;
    re[idx]=d*10;
    ne[idx]=h[a];
    h[a]=idx++;
}
int get_w(int x)
{
	int sum=0;
	while(w[x])
	{
		sum+=w[x];
		w[x]=w[x]*re[x]/10;
	}
	return sum;
}

void tarjan(int u)
{
    dfn[u]=low[u]=++timestamp;
    stk[++top]=u; in_stk[u]=true;
    
    for(int i=h[u];~i;i=ne[i])
    {
        int j=e[i];
        if(!dfn[j])
        {
            tarjan(j);
            low[u]=min(low[u],low[j]);
        }
        else if(in_stk[j]) low[u]=min(low[u],dfn[j]);
    }
    
    if(dfn[u]==low[u])
    {
        int y=0;
        scc_cnt++;
        do
        {
            y=stk[top--];
            in_stk[y]=false;
            id[y]=scc_cnt;
            _size[scc_cnt]++;
            
        }while(y!=u);
    }
}

void dfs(int u)
{
	if(f[u]) return;
	int res=0;
	
	for(int i=h[u];~i;i=ne[i])
	{
		int t=e[i];
		dfs(t);
		res=max(res,f[t]+w[i]);
	}
	f[u]+=sum[u];
	f[u]+=res;
}
int main()
{
	memset(h,-1,sizeof(h));
	int n,m,s;
	cin>>n>>m;
	scc_cnt=n;
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		double d;
		cin>>a>>b>>c>>d;
		add(a,b,c,d);
	}
	cin>>s;
	for(int i=1;i<=n;i++)
	{
		if(dfn[i]==0) tarjan(i);
	}
		
	for(int i=1;i<=n;i++)
	{
		for(int j=h[i];~j;j=ne[j])
		{
			int k=e[j];
			int a=id[i], b=id[k];
			if(a==b)
			{
				sum[a]+=get_w(j);
				continue;
			}
			add(a,b,w[j],re[j]);
		}
	}

	dfs(id[s]);
	
	cout<<f[id[s]];

	return 0;
}

